package com.example.demo.service.aiService;

import com.example.demo.demo.invoke.DialogueState;
import com.example.demo.enums.EmotionScene;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.stream.Collectors;

@Service
public class AdviceService {

    private final ChatClient chatClient;

    // --- 模板A：用于信息不足时，生成引导性提问 ---
    private static final String CLARIFYING_QUESTION_PROMPT_TEMPLATE = """
            ### System Role ###
            你是一个名为【恋爱大师】的AI情感顾问，你的沟通风格温暖、理性、富有同理心。

            ### Context ###
            你正在与一位用户对话，以下是到目前为止的对话摘要：
            - 用户核心目标: {goal}
            - 已收集的关键信息:
            {slots}
            - 用户本轮的最新问题: "{query}"

            ### Your Task ###
            当前收集到的信息还不够充分，无法给出完整的建议。
            你的任务是：根据已知信息，生成一个【温和的、开放式的追问】，引导用户提供更多关于这件事的具体细节。
            **请注意：绝对不要给出任何分析或建议，只提出一个能推动对话继续的问题。**
            """;

    // --- 模板B：用于信息充足时，生成最终建议 ---
    private static final String FINAL_ADVICE_PROMPT_TEMPLATE = """
            ### System Role ###
            你是一个名为【恋爱大师】的AI情感顾问。你的沟通风格温暖、理性、富有同理心。
            你的目标是为用户提供清晰的话术建议、可行的行动步骤和深刻的心理学分析。
            请严格按照“心理分析-行动建议-话术参考”的结构来回答。

            ### Context ###
            你正在与一位用户对话，以下是到目前为止的对话摘要：
            - 用户核心目标: {goal}
            - 已收集的关键信息:
            {slots}
            - 用户本轮的最新问题: "{query}"

            ### Your Task ###
            你已经收集到了足够的信息。请综合以上所有上下文，为用户的“最新问题”生成一段详细、有深度且富有共情能力的【最终指导建议】。
            """;


    public AdviceService(ChatClient.Builder chatClientBuilder) {
        // 初始化基于内存的对话记忆
        MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder()
                .chatMemoryRepository(new InMemoryChatMemoryRepository())
                .maxMessages(5)
                .build();
        this.chatClient = chatClientBuilder
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(chatMemory).build()
                )
                .build();
    }

    /**
     * 【已重构】根据对话状态的“完整度”，动态决定是提问还是回答。
     */
    public String generateAdvice(DialogueState currentState, String originalQuery) {
        // --- 步骤 1: 决策 - 判断信息是否充足 ---
        boolean isSufficient = isStateSufficient(currentState);

        String promptTemplate;
        if (isSufficient) {
            // 如果信息充足，选择模板B
            promptTemplate = FINAL_ADVICE_PROMPT_TEMPLATE;
        } else {
            // 如果信息不足，选择模板A
            promptTemplate = CLARIFYING_QUESTION_PROMPT_TEMPLATE;
        }

        // --- 步骤 2: 准备 - 为模板填充参数 ---
        EmotionScene goal = currentState.getUserGoal();
        Map<String, Object> slotsMap = currentState.getAccumulatedSlots();

        String slotsString = slotsMap.entrySet().stream()
                .filter(entry -> entry.getValue() != null)
                .map(entry -> String.format("  - %s: %s", entry.getKey(), entry.getValue().toString()))
                .collect(Collectors.joining("\n"));

        if (slotsString.isEmpty()) {
            slotsString = "  - (暂无已收集信息)";
        }

        String finalSlotsText = slotsString; // 'effectively final' for lambda

        // --- 步骤 3: 执行 - 调用AI并返回结果 ---
        return this.chatClient.prompt()
                .user(userSpec -> userSpec
                        .text(promptTemplate) // 动态传入选择好的模板
                        .param("goal", goal != null ? goal.toString() : "尚未明确")
                        .param("slots", finalSlotsText)
                        .param("query", originalQuery)
                )
                .call()
                .content();
    }

    /**
     * 辅助方法，用于定义“信息是否充足”的规则。
     * 这是对话策略的核心决策逻辑。
     *
     * @param state 当前的对话状态
     * @return 如果信息充足则返回 true，否则返回 false
     */
    private boolean isStateSufficient(DialogueState state) {
        // 如果连核心目标都未知，则信息肯定不充足
        if (state.getUserGoal() == null || state.getUserGoal() == EmotionScene.UNKNOWN) {
            return false;
        }
        // 定义我们的“充足”规则：至少包含一个明确的“事件”，并且至少有一个相关的“人物”信息。
        // 你可以根据业务需求，任意调整这里的规则，让AI的决策更智能。
        boolean hasEvent = state.isSlotFilled("EVENT");
        boolean hasPerson = state.isSlotFilled("PERSON_CORE") || state.isSlotFilled("PERSON_RELATED");

        // 举例：对于“考虑分手”这个复杂议题，我们可能需要更多信息
        if (state.getUserGoal() == EmotionScene.CONSIDERING_BREAKUP) {
            // 要求除了事件和人物，还需要知道原因
            boolean hasReason = state.isSlotFilled("REASON") || state.isSlotFilled("CONFLICT_REASON");
            return hasEvent && hasPerson && hasReason;
        }

        return hasEvent && hasPerson;
    }
}